//package com.example.design.flowable;
//
//import org.flowable.engine.*;
//import org.flowable.engine.history.HistoricActivityInstance;
//import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
//import org.flowable.engine.repository.Deployment;
//import org.flowable.engine.runtime.ProcessInstance;
//import org.flowable.task.api.Task;
//
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
// pom需要打开相关依赖
//public class Test {
//
//    private final static String processInstanceKey = "MyHolidayUI";
//
//    public static void main(String[] args) {
//        // 获取流程引擎
//        ProcessEngine processEngine = getProcessEngine();
//
//        // 部署流程
//        deploy(processEngine);
//
//        // 启动一个流程实例
////        startProcess(processEngine);
//
//        // 查看任务
////        List<Task> list = getTask(processEngine);
////        for (Task task : list) {
////            System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());
////            System.out.println("task.getId() = " + task.getId());
////            System.out.println("task.getAssignee() = " + task.getAssignee());
////            System.out.println("task.getName() = " + task.getName());
////        }
//
//        // 任务审批
////        finishTask(processEngine);
//
//        // 删除流程
////        remove(processEngine);
//
//        // 查看历史
////        List<HistoricActivityInstance> historicActivityInstances = showHistory(processEngine);
////        for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
////            System.out.println(historicActivityInstance.getActivityId() + " took "
////                    + historicActivityInstance.getDurationInMillis() + " milliseconds");
////        }
//    }
//
//    /**
//     * ACT_HI_ACTINST
//     */
//    private static List<HistoricActivityInstance> showHistory(ProcessEngine processEngine) {
//        HistoryService historyService = processEngine.getHistoryService();
//        return historyService.createHistoricActivityInstanceQuery()
//                .processDefinitionId("MyHolidayUI:1:15004")
//                .finished()
//                .orderByHistoricActivityInstanceEndTime().asc()
//                .list();
//    }
//
//    /**
//     * ACT_RE_DEPLOYMENT的id
//     */
//    private static void remove(ProcessEngine processEngine) {
//        RepositoryService repositoryService = processEngine.getRepositoryService();
//        // 删除流程定义，如果该流程定义已经有了流程实例启动则删除时报错
//        // repositoryService.deleteDeployment("1");
//        // 级联删除，如果 boolean值为true时，会删除所有和当前部署的规则相关的信息，包括历史的信息。
//        repositoryService.deleteDeployment("10001", true);
//    }
//
//    /**
//     * 每个流程节点审批完对应的表ACT_RU_TASK就少一条任务数据,直到所有的流程节点都被对应的用户处理完
//     */
//    private static void finishTask(ProcessEngine processEngine) {
//        TaskService taskService = processEngine.getTaskService();
//        Task task = taskService.createTaskQuery()
//                .processDefinitionKey(processInstanceKey)
//                .taskAssignee("user")
//                .singleResult();
//        // 添加流程变量
//        Map<String, Object> variables = new HashMap<>();
////        variables.put("approved",false);
//        // 完成任务
//        taskService.complete(task.getId(), variables);
//    }
//
//    /**
//     * ACT_RU_TASK的表数据
//     */
//    private static List<Task> getTask(ProcessEngine processEngine) {
//        TaskService taskService = processEngine.getTaskService();
//        return taskService.createTaskQuery()
//                .processDefinitionKey(processInstanceKey)
//                .taskAssignee("user")
//                .list();
//    }
//
//    /**
//     * act_hi_actinst 流程实例执行历史
//     * act_hi_identitylink 流程的参与用户的历史信息
//     * act_hi_procinst 流程实例历史信息
//     * act_hi_taskinst 流程任务历史信息
//     * act_ru_execution 流程执行信息
//     * act_ru_identitylink 流程的参与用户信息
//     * act_ru_task 任务信息
//     */
//    private static void startProcess(ProcessEngine processEngine) {
//        // 启动流程实例通过 RuntimeService 对象
//        RuntimeService runtimeService = processEngine.getRuntimeService();
//        // 构建流程变量
//        Map<String, Object> variables = new HashMap<>();
//        variables.put("employee", "张三");// 谁申请请假
//        variables.put("nrOfHolidays", 3); // 请几天假
//        variables.put("description", "工作累了，想出去玩玩"); // 请假的原因
//        // 启动流程实例，第一个参数是流程定义的key
//        ProcessInstance processInstance = runtimeService
//                // key是创建流程图的时候自定义的。注意保证唯一
//                .startProcessInstanceByKey(processInstanceKey, variables);// 启动流程实例
//        // 输出相关的流程实例信息
//        System.out.println("流程定义的ID：" + processInstance.getProcessDefinitionId());
//        System.out.println("流程实例的ID：" + processInstance.getId());
//        System.out.println("当前活动的ID：" + processInstance.getActivityId());
//    }
//
//    /**
//     * act_re_deployment: 流程定义部署表，每部署一次就增加一条记录
//     * act_re_procdef ：流程定义表，部署每个新的流程定义都会在这张表中增加一条记录
//     * act_ge_bytearray ：流程资源表，流程部署的 bpmn文件和png图片会保存在该表中
//     */
//    private static void deploy(ProcessEngine processEngine) {
//        RepositoryService repositoryService = processEngine.getRepositoryService();
//        Deployment deployment = repositoryService.createDeployment()
//                .addClasspathResource("process/MyHolidayUI.bpmn20.xml")
////                .addClasspathResource("第二个")
//                .name("test")
//                .deploy();
//        System.out.println("deployment:" + deployment.getId());
//    }
//
//    private static ProcessEngine getProcessEngine() {
//        // 流程引擎配置对象
//        ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
//                .setJdbcUrl("jdbc:mysql://192.168.33.128:3306/flowable?serverTimezone=UTC&nullCatalogMeansCurrent=true")
//                .setJdbcUsername("root")
//                .setJdbcPassword("123456")
//                .setJdbcDriver("com.mysql.cj.jdbc.Driver")
//                .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
//                //关闭异步，不关闭历史数据的插入就是异步的，会在同一个事物里面，无法回滚
//                //开发可开启会提高些效率，上线需要关闭
//                .setAsyncExecutorActivate(false);
//
//        // 获取流程引擎对象
//        ProcessEngine processEngine = cfg.buildProcessEngine();
//        return processEngine;
//    }
//}
